package com.ting.test.algorithms.array;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/**
 * Created by 雷霆 on 2020/3/11.
 * <p>
 * Description：
 * 给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。
 * <p>
 * 说明：
 * <p>
 * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗？
 * <p>
 * 示例 1:
 * <p>
 * 输入: [2,2,1]
 * 输出: 1
 * 示例 2:
 * <p>
 * 输入: [4,1,2,1,2]
 * 输出: 4
 */
public class FindDuplicate2 {
    public static void main(String[] args) {
        int[] arr = new int[]{2, 2, 1};
        Integer result = findDuplicate2(arr);
        System.out.println(result);
    }

    /**
     * 考虑1 ≤ a[i] ≤ n （n为数组长度）
     *
     * @param arr
     * @return
     */
    public static Integer findDuplicate3(int[] arr) {
        HashMap<Integer, Integer> map = new HashMap();
        for (int i = 0; i < arr.length; i++) {
            Integer value = map.get(arr[i]);
            if (null == value) {
                map.put(arr[i], 1);
            } else {
                map.put(arr[i], value + 1);
            }
        }
        Iterator<Integer> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            if (map.get(value) < 2) {
                return value;
            }
        }
        throw new RuntimeException();
    }

    /**
     * 异或的交换特性
     * 0^1=1
     * 0^0=0;
     * 1^1=0
     *
     * @param arr
     * @return
     */
    public static Integer findDuplicate2(int[] arr) {
        int result = 0;
        for (int n : arr) {
            result = result ^ n;
        }
        return result;

    }

}
